#ifndef __XLX_CONFIG_H__
#define __XLX_CONFIG_H__
// tutu_config.h

#include "xlx_define.h"

//------开关状态----------

// 开启所有 
#define ENABLE_ALL 0xffffffff
// 开启震动 
#define ENABLE_SHAKE 1
// 开启进围栏 
#define ENABLE_FENCEIN (1<<1)
// 开启出围栏 
#define ENABLE_FENCEOUT (1<<2)
// 开启超速检测 
#define ENABLE_SPEED (1<<3)
// 开启油电报警 
#define ENABLE_POWER (1<<4)
// 开启sos 
#define ENABLE_SOS (1<<5)
// 开启拆卸报警 
#define ENABLE_UNINSTALL (1<<6)
// 开启网络 
#define ENABLE_NET (1<<7)
// 开启定位 
#define ENABLE_GPS (1<<8)
// 开启拐点补传 
#define ENABLE_TURN (1<<9)
// 开启ACC报警 
#define ENABLE_ACC (1<<10)
// 气压开关
#define ENABLE_AIR (1<<11)

//end------------------------

typedef struct {
    u32 enter_time;// 多少分钟进入飞行模式 
    u32 exit_time;// 多少分钟退出飞行模式 
    u16 counter;// 循环次数 
    u8 enable;// 激活或禁用, 1:激活  0：禁用 
    u8 step;// 到哪个步骤了 
}TutuFlyingMode;

typedef struct{
    u8 mode;// 0:关闭,1:开启,2:持续声控报警多久,3:智能声控报警 
    u8 file_longtime;// 声控告警文件时长，秒数 
    u32 hold_time;// 持续时间,秒数 
    u32 hold_time_final;// 记录设定的值 
    u32 cmd_time;// 记录收到指令的时间 
}TutuAudioRecordMode;

// 设备状态记录 
typedef struct{
    u8 power;// 电量百分比 
    u8 satellite_size;// 卫星连接数量 
    u8 gsm_signal;// 电话卡信号百分比 
    u8 status;// 设备状态,按位计算(油电、gps定位、充电、acc、震动) 
}TutuDeviceStatus;

// 全局状态，同步保存到设备里面（禁止在中间插入新的数据！！！）
typedef struct {
    u32 enable_status;// 所有开关状态 
    u32 gps_inteval;// gps定位间隔时间 
    u16 snd_heart_time;// 发送心跳时间,秒数 
    u8 shake_sensitivity;// 震动灵敏度 
    u8 audio_sensitivity;// 声控报警灵敏度 
    u8 audio_bitrate;// 音频文件码率 
    //震动自动开启gps功能，1：自动开gps 0:不会触发gps开启
    u8 shake_auto_open_gps;
    TutuFlyingMode fly_mode;// 飞行模式 
    TutuAudioRecordMode audio_mode;// 声控报警模式 
    BCD_t imei[8];// 设备号 
    BCD_t iccid[10];// 电话卡iccid 
    char device_pwd[8];// 设备密码 
    u8 mode;// 当前设备模式, 0：正常模式   1:飞行模式   2：短信模式  3:心跳模式 
    u8 speed_limit[8];// 多个限速阶段,超过一个限速阶段则报警 
    char white_phonenum[5][16];// 白名单电话号码 
    char sos_phonenum[5][16];// sos求救电话号码 
    u8 low_voltage_threshold;// 低电检测阈值 
    u16 audio_sensitivity_hold_time;// 声控报警灵敏度持续时间
    u8 shake_alert_enable;  //震动告警上报开关，1表示开，0表示关

    // 老人机增加
    int voice_volume;        // 语音通道音量
    u8 tell_time_start;     // 整点报时 开始
    u8 tell_time_end;       // 整点报时 结束

    u8 rtmp_play_format;        // rtmp播放格式，PCM
    u8 rtmp_play_sample_fmt;    // rtmp采样深度
    u32 rtmp_play_sample_rate;   // rtmp采样率
    u8 rtmp_play_channel;       // 通道
    
    u32 auto_open_gps_interval;       // 多少秒自动开启一次GPS
    
    u8 auto_fly_time_start_hour;        // 自动进入低功耗的开始时间， 小时
    u8 auto_fly_time_start_minute;      // 自动进入低功耗的开始时间， 分钟
    u32 auto_fly_run_time;              // 进入飞行模式后多长时间退出来，单位是：秒
    u16 auto_fly_exit_sos_time;        // 当按sos键后，上报了SOS告警后，多长时间重新进入休眠模式，单位是：秒
}TutuConfig;

typedef struct{
    char server_host[64];// 服务器域名 
    u16 server_port;// 服务器端口号 
    char tms_srv_host[64];// 服务器域名 
    u16 tms_srv_port;// 服务器端口号 
}TutuServerCfg;

typedef struct{
    u8 enable;// 1:开启  0：禁止 
    s16 time;// 倒计时秒数 
}TutuRestartOS;

typedef struct{
    u8 enable;// 1:开启  0：禁止 
    s16 time;// 倒计时秒数 
    u16 check_counter;// 检测次数 
}TutuRestartNetwork;

typedef struct{
    u8 lastv;
    u16 alert_interval;// 告警间隔时间（秒） 
}TutuCheckLight;

typedef struct{
    u8 upload;// 1上报过，0没上报过 
    u8 counter;// 统计 
    u16 alert_interval;// 
}TutuLowVoltage;

// 全局参数
typedef struct{
    // 0-静止    
    // 1-震动    
    // 2-检测中 
    u8 shake_state;
    u8 device_run_state;// 设备运动状态,0:静止，1:设备一直在运动 
    u32 shake_time;// 记录震动开始时间 
    u32 quiet_time;// 记录设备安静时间 
    // 是否可以直接进入上报心跳功能, 1:立即进入一次心跳代码  0：表示不进入此代码 
    u8 flag_enter_heart_code;
    // 是否可以直接进入上报定位功能, 1:立即进入一次gps定位代码,采集gps点  0：表示不进入 
    u8 flag_enter_gps_pos_code;
    u8 flag_enter_wifi_pos_code;// 1：可以上报wifi ， 0：不上报wifi 
    u8 flag_enter_lbs_pos_code;// 1：上报lbs ，  0：不上报lbs 

    // 是否使用网络功能, 1:使用网络功能    0：表示不使用 
    u8 enable_net_unit;
    // 是否使用gps功能， 1：使用  0：不使用 
    u8 enable_gps_unit;
    
    u8 server_connected;// 服务连接状态，3:连接被关闭  ，2:正在连接 ，1：连接  ，0：未连接 
    char fota_ipaddr[16];// fota下载地址 
    u16 fota_port;// fota下载地址端口号 

    u32 login_action_time;// 记录指令登陆有效时间内，超出这个时间则权限无效 
    u8 is_login_server;// 是否登录到服务器，0：没有登陆 1：登录状态 
    u8 is_login_msm;// 是否短信登陆，否则短信没有权限执行敏感指令,0：没有登陆 1：登录状态 
    //u16 snd_heart_time;// 发送心跳时间,秒数 
    TutuDeviceStatus device_status;// 设备状态记录 

    TutuRestartOS restart_cfg;// 多久后系统重启 
    TutuRestartNetwork network_restart_cfg;// 多久后网络重启 
    TutuCheckLight light_cfg;// 检查光感拆卸 

    // 一次性操作,网络持续多少秒,和enable_net_unit可同时凑效，相互不影响 
    u16 net_once_hold_time;

    u16 up_sync_status_counter;// 上传状态同步计数，次数消耗完，则不上传，大于0则上报设备当前状态 

    u16 shake_alert_counter;// 震动告警倒计时变量 

    u32 vibrate_5min;// 5分钟内震动次数 
    
    u8 sim_card_step;// 检测是否插卡，根据插卡流程判断重启 

    TutuLowVoltage low_voltage_cfg;// 低电配置 

    u32 ulp_sleep_status;            // 超低功耗模式时，休眠前上报服务器, 表示本次休眠多长时间，单位是秒
    u8 ulp_wakeup_source;            // 唤醒源

    u8 speaker_open_flag;           //　喇叭功放是否打卡

}TutuGlobalParam;


typedef struct{
    // 进入模式 
    void (*enter)(void);
    // 处于模式中，执行模式中的内容 
    void (*do_frame)(void);
    // 退出模式 
    void (*exit)(void);
}TutuRunMode;

#endif
